package org.kingtop.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.Feature;
import com.alibaba.fastjson.serializer.SerializeFilter;
import com.alibaba.fastjson.serializer.SerializerFeature;

import java.lang.reflect.Type;

/**
 * 格式化工具类，主要是为了屏蔽实现类
 * @author 陈金波
 */
public class JsonUtil {

    /**
     * 将一个对象转换成字符串，如果属性为Null，则转换的时候忽略该属性
     *
     * @param obj 转换的对象
     * @return
     */
    public static String toString(Object obj) {
        return JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);
    }

    /**
     * 将一个对象转换成字符串，如果属性为Null，则转换的时候忽略该属性
     *
     * @param obj        转换的对象
     * @param datePattem 时间格式化
     * @return
     */
    public static String toString(Object obj, String datePattem) {
        return JSON.toJSONStringWithDateFormat(obj, datePattem);
    }

    /**
     * 将一个对象转换成字符串，可设置要返回哪几个字段或过滤字段等设置
     *
     * @param obj               转换的对象
     * @param filters 转换设置
     * @return
     */
    public static String toString(Object obj, SerializeFilter... filters) {
        return JSON.toJSONString(obj, filters);
    }

    /**
     *
     * @param object      转换的对象
     * @param filter      字段过滤器
     * @param features    转换的时候是否将null字段也转换，true转换，false则省略该字段
     * @return String
     */
    public static String toString(Object object, SerializeFilter filter, SerializerFeature... features) {
        return JSON.toJSONString(object, filter, features);
    }

    /**
     *
     * @param object      转换的对象
     * @param filters     字段过滤器
     * @param features    转换的时候是否将null字段也转换，true转换，false则省略该字段
     * @return String
     */
    public static String toString(Object object, SerializeFilter[] filters, SerializerFeature... features) {
        return JSON.toJSONString(object, filters, features);
    }

    public static <T> T fromJson(String json, Class<T> clazz){
        return JSON.parseObject(json, clazz);
    }

    public static <T> T fromJson(String json, Class<T> clazz, Feature... features) {
        return JSON.parseObject(json, clazz, features);
    }

    public static <T> T fromJson(String json, Type type, Feature... features) {
        return JSON.parseObject(json, type, features);
    }

}
